package com.bestdreamer.thread_class;

public class ThreadLocalTest {
    public static void main(String[] args){
        // 启动两个线程，两个线程共享同一个 Acount
        Account at = new Account("初始名");
        // 虽然两个线程共享同一个账户，即只有一个账户名，但由于账户名是 ThreadLocal 类型的，所以每个线程都完全拥有各自的账户名副本，
        // 因此在 i == 6 之后，将看到两个线程访问同一个账户时出现不同的账户名
        new MyTest(at,"线程甲").start();
        new MyTest(at,"线程乙").start();
    }

}

class Account{
    // 定义一个 ThreadLocal 类型的变量，该变量将是一个局部变量,每个线程都会保留该变量的一个副本
    private final ThreadLocal<String> name = new ThreadLocal<>();
    // 定义一个初始化 name 属性的构造器
    public Account(String str){
        this.name.set(str);
        // 下面代码用于访问当前线程的 name 副本的值
        System.out.println("---" + this.name.get());
    }
    // name 的 setter 和 getter 方法
    public String getName(){
        return name.get();
    }
    public void setName(String str){
        this.name.set(str);
    }
}

class MyTest extends Thread{
    // 定义一个 Account 属性
    private final Account account;
    public MyTest(Account account,String name){
        super(name);
        this.account = account;
    }
    public void run(){
        // 循环 10 次
        for(int i = 0; i < 10; i++){
            // 当 i == 6 时输出将账户名替换成当前线程名
            if(i == 6){
                account.setName(getName());
            }
            // 输出同一个账户的账户名和循环变量
            System.out.println(account.getName() + "账户的 i 值：" + i);
        }
    }
}
